extends CenterContainer
class_name 卡牌堆类

@onready var 卡牌堆状态 = %"卡牌堆状态"
@onready var 状态机 = %"状态机"
@onready var 间隔 = %"间隔"
@onready var 位置识别区 = %"位置识别区"

@onready var 背景颜色 = %"背景颜色"
@onready var 边框颜色 = %"边框颜色"
@onready var 遮挡色 = %"遮挡色"
@onready var 音效播放器 = $"音效播放器"
@export var 背景色:Color=Color.WHITE
@onready var center = %center
@onready var right = %right
@onready var left = %left
@onready var label = $Label

signal 状态变化(变化数据)
signal 显示左间隔(index)
signal 隐藏左间隔(index)
signal 显示互动信息(index)
signal 隐藏互动信息(index)
signal 插入卡牌(卡牌)
signal 添加卡牌失败(卡牌)

var 卡牌堆数据:卡牌堆数据类:
	set(value):
		if 卡牌堆数据!=null:
			卡牌堆数据.卡牌堆数据变化.disconnect(当卡牌堆数据变化)
		卡牌堆数据=value
		if 卡牌堆数据!=null:
			卡牌堆数据.卡牌堆数据变化.connect(当卡牌堆数据变化)
		显示卡牌堆()
		
var 状态:String:
	get():
		return 状态机.当前状态.name

func _ready():
	_隐藏左间隔()
	背景颜色.color=背景色
	gui_input.connect(on_gui_input)
	mouse_entered.connect(on_mouse_entered)
	mouse_exited.connect(on_mouse_exited)
	恢复正常显示()
	启动状态机()
	
#region 状态机相关
func 启动状态机():
	状态机.启动("空闲")
	
func 切换状态(状态名:String):
	状态机.切换状态(状态名)
	
func _input(event):
	状态机.on_input(event)
	
func on_gui_input(event):
	状态机.on_gui_input(event)
	
func on_mouse_entered():
	状态机.on_mouse_entered()
	
func on_mouse_exited():
	状态机.on_mouse_exited()

func _get_drag_data(_at_position):
	状态机.on_drag_data()
	
func _on_center_mouse_entered():
	状态机.on_center_mouse_entered()

func _on_center_mouse_exited():
	状态机.on_center_mouse_exited()
	
func _on_left_mouse_entered():
	状态机.on_left_mouse_entered()

func _on_left_mouse_exited():
	状态机.on_left_mouse_exited()

func _on_right_mouse_entered():
	状态机.on_right_mouse_entered()

func _on_right_mouse_exited():
	状态机.on_right_mouse_exited()
#endregion

func 当卡牌堆数据变化(_卡牌堆数据:卡牌堆数据类):
	卡牌堆数据=_卡牌堆数据
		
func 显示卡牌堆():
	卡牌堆状态.显示卡牌堆(卡牌堆数据)
		
func 当状态变化(变化数据:Dictionary):
	状态变化.emit(变化数据)
	
func 显示为被选中():
	边框颜色.show()
	遮挡色.show()	
	
#region 互动显示相关
func 显示拖入状态(卡牌数据:卡牌数据类):
	if 可互动(卡牌数据):
		显示为可互动()
	else:
		显示为不可互动()
	
func 可互动(卡牌数据:卡牌数据类):
	if 卡牌堆数据!=null and 卡牌堆数据.获取可拖入动作(卡牌数据)!=null:
		return true
	return false

var tween
func 显示为可互动():
	tween = create_tween()
	tween.set_loops()
	tween.tween_property(边框颜色, "custom_minimum_size",Vector2(230,336), 0.15)
	tween.tween_property(边框颜色, "custom_minimum_size",Vector2(220,324), 0.15)
	tween.tween_property(边框颜色, "custom_minimum_size",Vector2(230,336), 0.15)
	tween.tween_property(边框颜色, "custom_minimum_size",Vector2(220,324), 0.15).set_delay(0.5)
	边框颜色.show()
	
func 显示为不可互动():
	遮挡色.show()		

func 恢复正常显示():
	_隐藏左间隔()
	边框颜色.hide()
	遮挡色.hide()	
	边框颜色.custom_minimum_size=Vector2(220,324)
	if tween:
		tween.kill() 
#endregion

func 获取可拖入动作(卡牌数据:卡牌数据类):
	if 卡牌数据!=null and 卡牌堆数据!=null:
		return 卡牌堆数据.获取可拖入动作(卡牌数据)
	return null

#region 间隔显示相关
func _显示左间隔():
	间隔.show()
	left.custom_minimum_size.x=130
	
func _隐藏左间隔():
	间隔.hide()
	left.custom_minimum_size.x=44
#endregion

#region 卡牌堆数据相关操作
func is_empty():
	return 卡牌堆数据.is_empty()
	
func 添加卡牌(卡牌:卡牌数据类):
	if 卡牌堆数据.添加卡牌(卡牌):
		return true
	else:
		添加卡牌失败.emit(卡牌)
		return false
	
func 拽起卡牌():
	var 卡牌数据=卡牌堆数据.拽起卡牌()
	return 卡牌数据

func _插入卡牌(卡牌):
	插入卡牌.emit(卡牌)
	
func 获取首卡牌():
	return 卡牌堆数据.获取首卡牌()

func 卡牌堆为空():
	return 卡牌堆数据.卡牌堆为空()	
#endregion

func 位于本节点():
	return 位置识别区.get_rect().has_point(get_local_mouse_position())

func 位于左区域():
	return left.get_rect().has_point(get_local_mouse_position())

func 位于右区域():
	return right.get_rect().has_point(get_local_mouse_position())
	
func 位于中区域():
	return center.get_rect().has_point(get_local_mouse_position())
		
